package com.will.txj.wy.files.utils;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpException;
import com.will.txj.wy.files.config.SftpPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;

import java.io.InputStream;
import java.io.OutputStream;

/**
 * @author: wen-yi;
 * @date: 2021/12/4 14:27;
 * @Description: 文件服务器操作工具类
 */
@Component
public class SftpUtil {

    public static final String DIR = "/data/files";

    @Autowired
    private SftpPool sftpPool;

    /**
     * 向FTP服务器上传文件
     *
     * @param inputStream 上传到FTP服务器上的文件流
     * @return 成功返回文件名，否则返回null
     * @Version2.0
     */
    public void upload(String directory, String fileName, InputStream inputStream) throws Exception {
        ChannelSftp sftp = sftpPool.getChannelSftp();
        sftp.cd(directory);
        sftp.put(inputStream, fileName);//执行文件传输
        inputStream.close();
        sftpPool.returnChannelSftp(sftp);//归还资源
    }

    /**
     * 从FTP服务器下载文件
     *
     * @param fileName     FTP服务器中的文件名
     * @param outputStream 响应客户的响应体
     * @Version1.0
     */
    public void downLoad(String directory, String fileName, OutputStream outputStream) throws Exception {
        ChannelSftp sftp = sftpPool.getChannelSftp();
        try {
            sftp.cd(directory);
            InputStream inputStream = sftp.get(fileName);
            FileCopyUtils.copy(inputStream, outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            sftpPool.returnChannelSftp(sftp);
        }
    }



    /**
     * 从FTP服务器删除文件
     *
     * @param fileName     FTP服务器中的文件名
     * @Version1.0
     */
    public void delete(String directory, String fileName) throws Exception {
        ChannelSftp sftp = sftpPool.getChannelSftp();
        try {
            sftp.cd(directory);
            sftp.rm(fileName);
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            sftpPool.returnChannelSftp(sftp);
        }
    }
}
